For many years following the advent of electronic computer systems, application programs were executed locally within a single mainframe computer or minicomputer. Initially, applications were encoded on large sets of Hollerith cards and were executed one at a time in batch-mode processing either without the benefit of an operating system or, as computer systems evolved, using primitive operating-system-like functionality. Subsequently, modern operating systems were developed to allow many different application programs to execute concurrently within a single computer system, using techniques including time-division multiplexing to provide the appearance of simultaneous execution on a single-processor computer system. Ultimately, as computer networking, operating systems, virtualization layers, and computer hardware evolved, it became possible to execute large, compute-intensive distributed applications across multiple networked computer systems. Currently, large distributed computer systems, including cloud-computing facilities, provide users with the ability to execute large, distributed applications across multiple distributed computer centers located in different geographical locations. As one example, many large e-commerce websites execute as distributed web-server applications that execute in multiple cloud-computing facilities, each including hundreds to thousands of server computers, network-attached storage systems, multiple internal networks, and other distributed-computing-system components. Computational bandwidth and storage resources are now offered as services by large cloud-computing providers much like electricity and water are provided by utility companies.
While there has been remarkable progress in computer hardware, distributed operating systems and virtualization platforms, computer networking, and tools and techniques for designing and implementing distributed applications, many technological hurdles and problems associated with distributed applications remain. As one example, when a distributed application offers a service, through a client/response protocol or web interface, the distributed service application often supports many different internet-protocol (“IP”) addresses or uniform resource locators (“URLs”) to which requests for the service can be directed from client computers. The multiple IP addresses or URLs may be distributed across many different front-end server computers within many different computer centers so that the request traffic is distributed across multiple computer centers and multiple front-end servers within each of the computer centers. However, use of multiple IP addresses or URLs does not, by itself, generally provide effective balancing of the total workload applied by remote clients to the distributed service application among the many different servers or virtual servers within a distributed computer system on which the distributed service application runs. In one approach to attempting to balance the computational load over multiple servers or virtual servers, an external load-balancer system is used to distributed incoming service requests among multiple computational nodes. However, external load balancers (“ELBs”) are relatively expensive, complicated to set up and operate, and are generally unable to be easily scaled as the number of servers or virtual servers that execute a distributed service application increase. Moreover, ELBs generally cannot access distributed-application-state information needed to effect anything close to an even distribution, over time, of the computational load applied by remote client devices to the distributed service application among the many servers or virtual servers controlled, at least in part, by the distributed service application. Designers and developers of distributed applications and distributed computer system continue to seek methods and systems for more efficient and robust support of distributed-application-program execution within distributed computer systems.